Information Hiding (and Leakage)
「情報の隠蔽(と漏洩)」Information Hiding / Information Leakage
Deep Module を作るためのテクニック
最も重要なのは、情報隠蔽(Information Hiding)をすること
実装するための方法に関する詳細 をカプセル化する
データ構造やアルゴリズム、低レベルの詳細など
e.g. TCP ネットワークプロトコルの実装方法 や JSON の解析方法
Information Hiding は2つの方法で複雑さを軽減する
インタフェースの単純化
システムの変更を容易に
モジュールの外には依存関係がないので、その情報に関する設計変更は、そのモジュール内で完結する
Information Hiding でどのような情報を隠蔽するかを吟味するのが大切
より多くの情報を隠蔽できれば、インタフェースもシンプルになる(Deep Class)
Information Hiding と 可視性 を private にすることとは異なる
getter や setter を通じて情報が公開される可能性があるため
情報を完全に隠蔽するのが理想
部分的な Information Hiding にも価値はある
e.g. 一部のユーザだけ必要とする機能や情報
一般的な使い方からは見えないように、別のメソッドからアクセスされるようにする
いまいちイメージしづらい。以下のようなイメージ?radish-miyazaki.icon
code:ruby
class GraphicsLibrary
def initialize(image)
@image = image
end
def change_pixel(x, y, color)
# ここでピクセルの変更の実装が行われると仮定
puts "Pixel at (#{x}, #{y}) changed to color #{color}."
end
def display_image
# 通常の使用ケースではピクセルの変更についての詳細は意識させない
puts "Displaying the image."
end
end
Information Leakage は詳細が インタフェース に反映されていると生じる
それ以外でも生じる(Back-door Leakage)
e.g. 特定のファイルフォーマットを処理する2つのクラス(Read / Write)
フォーマットが変われば、両方のクラスを修正する必要がある
Information Leakage は レッドフラグ の1つ
良いソフトウェア設計者になるスキルの1つは、Information Leakage に対する高い感受性
Information Leakage を見つけたら、「どのようにクラスを1つにまとめられるか」を考えるべき
影響を受けるクラスから情報だけを抜き出し、新しいクラスを作るアプローチも考えられる
この方法が有効なのは、詳細な情報を抽象化するシンプルなインタフェースを見つけられることできた場合にのみ有効
新しいクラスがインタフェースを通じて情報を公開してしまうと、価値は無い
Back-door Leakage を インタフェースによる Information Leakage に置き換えただけ
クラスを少し大きくすることで改善できることが多い
一方で、大きすぎるクラスも問題である
Information Leakage の主な原因は、時間的な分解(Temporal Decomposition) と呼ばれる設計手法である
Temporal Decomposition とは、システムの構造が処理が実行される順番に反映されている状態を指す
大抵の場合、処理の順番は重要なのでアプリケーションのどこかに現れる
Information Hiding と一貫性がある場合を除き、順番はモジュール構造に反映されるべきでない
e.g. 異なるステップで異なる情報を用いるケース
Temporal Decomposition も レッドフラグ の1つ
モジュール設計を行うときは、処理の順番ではなく処理を実行するのに必要な知識に焦点を当てるべき
Information Hiding はクラス内などでも適用可能
メソッドの設計
各メソッドがある情報や機能をカプセル化し、クラスの他の部分から見えないように隠蔽する
インスタンス変数が使用される場所を減らす
クラス内の依存関係を軽減し、複雑さを減らすことが可能
Taking it too far
どの情報がモジュール外に必要かを認識し、必要ならば公開することが重要
Information Hiding が意味を持つのは、隠蔽される情報がそのモジュール外で必要とされない場合のみ
一方、ソフトウェア設計者としては、モジュール外に公開する情報を最小限にすることを目標とすべき
e.g. 設定パラメータによって、モジュールのパフォーマンスが異なるケース
モジュールが自動的に設定を調整できるのであれば、公開しない
調整できないのであれば、設定パラメータとして公開する
hr.icon
要約
Information Hiding と Deep Module は密接に関係している
モジュール が多くの情報を隠すと、モジュールによって提供される機能が多くなる一方で インタフェース が小さくなる
これが Deep Module
逆にモジュールが情報を隠さない場合、モジュールはあまり機能を持たないか複雑なインタフェースを持つ
モジュール設計は、処理の手順(Temporal Decomposition)に焦点を当てないようにする
Information Leakage や Shallow Module につながる
モジュール設計は、必要な知識単位でカプセル化されるように行う
Information Hiding や Deep Module を実現できる
#読書メモ